dijkstra小结+(虚拟起点、终点简单介绍)

对于dijkstra一类的题要注意以下几点:


        1.要注意题目中要求的是不是有向图(这点经常容易被忽略)。有的要求无向图(如:HDUOJ_1869(六度分离)当初没考虑是无向图,结果一直错),而有的题要求是 有向图(如:HDUOJ_(Choose the best route )2680由于当时当作无向图处理,也是一直出错)。

       2.有的题要考虑重边问题(这点经常容易遗忘),在输入数据时可能两个点之间的相关数据有多组,根据题意 取最大者或最小者。(如:HDUOJ_1874(畅通工程续))。

      3.要根据不同的题,适度改动模板,不能死记模板,要在理解的基础上记忆。通常做的题都是求最短路径或最小值,但是有的题却是求最大值(如:HDUOJ_1596(find the safest road)),与之前的求最小值(最短路径)恰恰相反。

     4.一般我们都是根据起点找终点,如:给出一个起点和一个终点,有时特殊时会给出一个起点,多个终点。此时需巧用for循环,调用dijkstra函数一次,

然后通过for循环查找不同终点的最短路径(如:HDUOJ_(Choose the best route )2680)。有时也会遇到多个起点,多个终点。此时会有两种情况,一种是n个起点,m个终点,每个起点都对应m个终点。此时需巧用双重for循环,第一层for控制起点的变换(多次调用dijkstra函数),第二层for循环控制终点的变换。这样比 每一组起点和终点都调用dijkstra函数省很多时间。(如:HDUOJ_1869(六度分离))。一种是多个起点和多个终点,但二者之间的组合都是随机的没有规律,这种只能每组起点和终点都调用一次,但是比较费时(如果可以的话,也可以采用别的方法解)(如:HDUOJ_2066(一个人的旅行))。

      5.有时我们也需转换一下思路,上面讲的都是通过起点找终点,但是有的题有时通过起点找终点比较麻烦,但是通过终点找起点却比较容易。如:当有多个起点,一个终点时,找出最短路径。此时从起点往终点找比较麻烦,甚至可能会超时。但是当把终点当作起点,原来的起点当作终点后,问题就转化为,一个起点,多个终点的问题,只需调用dijkstra函数一次,便可解决。(如:HDUOJ_(Choose the best route )2680)。

6.当有多个起点和多个终点求最短路径时,可以尝试用虚拟1个终点虚拟1个起点,从而使问题转化为最简单的求一个起点到一个终点的最短路径问题。(参照2066一个人的旅行(floyd+虚拟起点和虚拟终点

  虚拟起点和虚拟终点示意图:




       这只是本人在做了这几道题后总结出来的,可能会有些不足。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值